"""
命令行界面主程序

提供命令行界面，支持数据读取、分析和可视化功能。
"""

import sys
import argparse
from pathlib import Path
from typing import Optional

# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent.parent
sys.path.insert(0, str(project_root))

from src.core.data_reader import EpidemicDataReader
from src.core.data_analyzer import EpidemicDataAnalyzer
from src.core.data_visualizer import EpidemicDataVisualizer
from src.utils import (
    get_config, setup_logging, get_logger, info, error,
    ensure_directory, is_excel_file, get_excel_sheets
)


class EpidemicDashboardCLI:
    """疫情数据仪表板命令行界面"""
    
    def __init__(self):
        """初始化CLI"""
        self.setup_logging()
        self.logger = get_logger(__name__)
        self.data_reader = None
        self.data_analyzer = None
        self.data_visualizer = None
    
    def setup_logging(self):
        """设置日志系统"""
        setup_logging(level="INFO")
    
    def parse_arguments(self) -> argparse.Namespace:
        """解析命令行参数"""
        parser = argparse.ArgumentParser(
            description="香港疫情数据仪表板 - 命令行版本",
            formatter_class=argparse.RawDescriptionHelpFormatter,
            epilog="""
示例用法:
  python -m src.cli.main --file data/raw/香港各区疫情数据_20250322.xlsx --analyze
  python -m src.cli.main --file data/raw/香港各区疫情数据_20250322.xlsx --visualize
  python -m src.cli.main --file data/raw/香港各区疫情数据_20250322.xlsx --export-charts
            """
        )
        
        # 必需参数
        parser.add_argument(
            '--file', '-f',
            type=str,
            required=True,
            help='Excel数据文件路径'
        )
        
        # 可选参数
        parser.add_argument(
            '--sheet', '-s',
            type=str,
            help='指定工作表名称（默认为第一个工作表）'
        )
        
        parser.add_argument(
            '--output-dir', '-o',
            type=str,
            default='data/output',
            help='输出目录路径（默认: data/output）'
        )
        
        parser.add_argument(
            '--verbose', '-v',
            action='store_true',
            help='显示详细输出'
        )
        
        # 功能选项
        parser.add_argument(
            '--info',
            action='store_true',
            help='显示数据基本信息'
        )
        
        parser.add_argument(
            '--analyze',
            action='store_true',
            help='执行数据分析'
        )
        
        parser.add_argument(
            '--visualize',
            action='store_true',
            help='生成可视化图表'
        )
        
        parser.add_argument(
            '--export-charts',
            action='store_true',
            help='导出图表到文件'
        )
        
        parser.add_argument(
            '--export-data',
            action='store_true',
            help='导出分析数据到CSV文件'
        )
        
        parser.add_argument(
            '--all',
            action='store_true',
            help='执行所有功能（等同于 --info --analyze --visualize --export-charts）'
        )
        
        return parser.parse_args()
    
    def validate_file(self, file_path: str) -> bool:
        """
        验证文件
        
        Args:
            file_path: 文件路径
            
        Returns:
            文件是否有效
        """
        path = Path(file_path)
        
        if not path.exists():
            error(f"文件不存在: {file_path}")
            return False
        
        if not is_excel_file(path):
            error(f"不是有效的Excel文件: {file_path}")
            return False
        
        info(f"文件验证通过: {file_path}")
        return True
    
    def load_data(self, file_path: str, sheet_name: Optional[str] = None) -> bool:
        """
        加载数据
        
        Args:
            file_path: 文件路径
            sheet_name: 工作表名称
            
        Returns:
            是否加载成功
        """
        try:
            self.data_reader = EpidemicDataReader(file_path)
            
            if sheet_name:
                self.data_reader.read_sheet(sheet_name)
            else:
                # 读取第一个工作表
                sheets = get_excel_sheets(file_path)
                if sheets:
                    self.data_reader.read_sheet(sheets[0])
                else:
                    error("Excel文件中没有找到工作表")
                    return False
            
            info("数据加载成功")
            return True
            
        except Exception as e:
            error(f"数据加载失败: {e}")
            return False
    
    def show_data_info(self):
        """显示数据基本信息"""
        if not self.data_reader:
            error("请先加载数据")
            return
        
        try:
            info("=== 数据基本信息 ===")
            data_info = self.data_reader.get_data_info()
            print(data_info)
            
            sheets_summary = self.data_reader.get_sheets_summary()
            print("\n=== 工作表信息 ===")
            print(sheets_summary)
            
        except Exception as e:
            error(f"获取数据信息失败: {e}")
    
    def analyze_data(self):
        """执行数据分析"""
        if not self.data_reader:
            error("请先加载数据")
            return
        
        try:
            info("开始数据分析...")
            
            self.data_analyzer = EpidemicDataAnalyzer(self.data_reader.data)
            
            # 计算每日确诊病例
            daily_cases = self.data_analyzer.calculate_daily_confirmed_cases()
            
            # 计算区域统计
            regional_stats = self.data_analyzer.calculate_regional_stats()
            
            # 计算时间段统计
            time_stats = self.data_analyzer.calculate_time_period_stats()
            
            info("数据分析完成")
            
            # 显示分析结果摘要
            print("\n=== 分析结果摘要 ===")
            if daily_cases is not None and not daily_cases.empty:
                print(f"数据时间范围: {daily_cases.index.min()} 到 {daily_cases.index.max()}")
                print(f"总记录数: {len(daily_cases)}")
                print(f"最高单日新增: {daily_cases['新增确诊'].max():,}")
                print(f"累计确诊总数: {daily_cases['累计确诊'].max():,}")
            
        except Exception as e:
            error(f"数据分析失败: {e}")
    
    def visualize_data(self, output_dir: str):
        """生成可视化图表"""
        if not self.data_reader or not self.data_analyzer:
            error("请先加载数据并进行分析")
            return
        
        try:
            info("开始生成可视化图表...")
            
            # 确保输出目录存在
            output_path = ensure_directory(output_dir)
            charts_dir = output_path / "charts"
            ensure_directory(charts_dir)
            
            self.data_visualizer = EpidemicDataVisualizer(
                self.data_reader.data,
                self.data_analyzer.daily_cases
            )
            
            # 生成图表
            self.data_visualizer.plot_daily_cases()
            self.data_visualizer.plot_detailed_trends()
            
            info(f"图表已生成到: {charts_dir}")
            
        except Exception as e:
            error(f"生成可视化图表失败: {e}")
    
    def export_charts(self, output_dir: str):
        """导出图表"""
        if not self.data_visualizer:
            error("请先生成可视化图表")
            return
        
        try:
            info("导出图表...")
            # 图表已经在visualize_data中生成并保存
            info("图表导出完成")
            
        except Exception as e:
            error(f"导出图表失败: {e}")
    
    def export_data(self, output_dir: str):
        """导出分析数据"""
        if not self.data_analyzer:
            error("请先执行数据分析")
            return
        
        try:
            info("导出分析数据...")
            
            output_path = ensure_directory(output_dir)
            data_dir = output_path / "data"
            ensure_directory(data_dir)
            
            # 导出每日数据
            if self.data_analyzer.daily_cases is not None:
                daily_file = data_dir / "daily_cases.csv"
                self.data_analyzer.daily_cases.to_csv(daily_file, encoding='utf-8-sig')
                info(f"每日数据已导出: {daily_file}")
            
            # 导出区域统计
            if hasattr(self.data_analyzer, 'regional_stats') and self.data_analyzer.regional_stats is not None:
                regional_file = data_dir / "regional_stats.csv"
                self.data_analyzer.regional_stats.to_csv(regional_file, encoding='utf-8-sig')
                info(f"区域统计已导出: {regional_file}")
            
            info("数据导出完成")
            
        except Exception as e:
            error(f"导出数据失败: {e}")
    
    def run(self):
        """运行CLI"""
        try:
            # 解析参数
            args = self.parse_arguments()
            
            # 设置详细输出
            if args.verbose:
                setup_logging(level="DEBUG")
            
            info("=== 香港疫情数据仪表板 - 命令行版本 ===")
            
            # 验证文件
            if not self.validate_file(args.file):
                return 1
            
            # 加载数据
            if not self.load_data(args.file, args.sheet):
                return 1
            
            # 执行功能
            if args.info or args.all:
                self.show_data_info()
            
            if args.analyze or args.all:
                self.analyze_data()
            
            if args.visualize or args.all:
                self.visualize_data(args.output_dir)
            
            if args.export_charts or args.all:
                self.export_charts(args.output_dir)
            
            if args.export_data:
                self.export_data(args.output_dir)
            
            # 如果没有指定任何功能，默认显示信息
            if not any([args.info, args.analyze, args.visualize, 
                       args.export_charts, args.export_data, args.all]):
                self.show_data_info()
            
            info("程序执行完成")
            return 0
            
        except KeyboardInterrupt:
            info("程序被用户中断")
            return 1
        except Exception as e:
            error(f"程序执行失败: {e}")
            return 1


def main():
    """主函数"""
    cli = EpidemicDashboardCLI()
    return cli.run()


if __name__ == "__main__":
    sys.exit(main()) 